package cn.lovemmd.model.admin.common;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.JSONWriter;
import lombok.experimental.UtilityClass;

import java.util.List;

/**
 * FastJson2工具类
 * 提供便捷的JSON操作方法
 * 
 * @author TLS
 * @since 2024-01-01
 */
@UtilityClass
public class FastJsonUtils {

    /**
     * 对象转JSON字符串
     * 
     * @param obj 对象
     * @return JSON字符串
     */
    public static String toJsonString(Object obj) {
        return JSON.toJSONString(obj);
    }

    /**
     * 对象转JSON字符串（美化格式）
     * 
     * @param obj 对象
     * @return 美化的JSON字符串
     */
    public static String toJsonStringPretty(Object obj) {
        return JSON.toJSONString(obj, JSONWriter.Feature.PrettyFormat);
    }

    /**
     * JSON字符串转对象
     * 
     * @param json JSON字符串
     * @param clazz 目标类型
     * @param <T> 泛型
     * @return 对象
     */
    public static <T> T parseObject(String json, Class<T> clazz) {
        return JSON.parseObject(json, clazz);
    }

    /**
     * JSON字符串转List
     * 
     * @param json JSON字符串
     * @param clazz 目标类型
     * @param <T> 泛型
     * @return List对象
     */
    public static <T> List<T> parseArray(String json, Class<T> clazz) {
        return JSON.parseArray(json, clazz);
    }

    /**
     * 判断字符串是否为有效的JSON
     * 
     * @param json JSON字符串
     * @return 是否有效
     */
    public static boolean isValidJson(String json) {
        try {
            JSON.parse(json);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 深度复制对象
     * 
     * @param obj 原对象
     * @param clazz 目标类型
     * @param <T> 泛型
     * @return 复制后的对象
     */
    public static <T> T deepCopy(Object obj, Class<T> clazz) {
        String json = toJsonString(obj);
        return parseObject(json, clazz);
    }

    /**
     * 配置FastJson2全局设置
     */
    public static void configureFastJson() {
        // 配置序列化特性
        JSON.config(JSONWriter.Feature.WriteMapNullValue);
        JSON.config(JSONWriter.Feature.WriteNullListAsEmpty);
        JSON.config(JSONWriter.Feature.WriteNullStringAsEmpty);
        JSON.config(JSONWriter.Feature.WriteNullNumberAsZero);
        JSON.config(JSONWriter.Feature.WriteNullBooleanAsFalse);
        JSON.config(JSONWriter.Feature.WriteEnumsUsingName);
        JSON.config(JSONWriter.Feature.WriteBigDecimalAsPlain);
        
        // 配置反序列化特性（移除不支持的SupportAutoType）
        JSON.config(JSONReader.Feature.SupportArrayToBean);
        JSON.config(JSONReader.Feature.InitStringFieldAsEmpty);
        JSON.config(JSONReader.Feature.UseDefaultConstructorAsPossible);
    }
}
